desc:MIDI Delay v0.1

in_pin:none
out_pin:none

slider1:0<-100,100,0.01>Delay (ms)

@init     //////////////////////////////

queue = 1024;
  memset(queue, 0, 1024);
  
head = tail = 0;

@slider   //////////////////////////////

slider1 = min(max(slider1, -100), 100);
delay = (slider1 * 0.001 * srate) | 0;

delay < 0 ? (
  pdc_delay = -delay;
  pdc_midi = 1;
):(
  pdc_delay = 0;
  pdc_midi = 0;
);
   
@block    //////////////////////////////

while (
  midirecv(offset, msg1, msg23) ? (
    delay > 0 ? (
      queue[tail] = offset + delay;
      queue[tail + 1] = msg1;
      queue[tail + 2] = msg23;
      tail += 3;
    ):(
      midisend(offset, msg1, msg23);
    );
  1;
  );
);

i = head;
while (
  i < tail ? (
    queue[head] < samplesblock ? ( 
      midisend(queue[head], queue[head + 1], queue[head + 2]);
      head += 3;
      i = head;
    ):(    
      queue[i] -= samplesblock;
      i += 3;
    );
  1;  
  );
);

// Reset queue when empty
tail > 0 && head == tail ? (
  memset(queue, 0, tail);
  head = tail = 0;
);
